﻿using ServiceStack.Redis;
using System;
using System.Windows;

namespace DeskRedis
{
    /// <summary>
    /// WinInsert4Hash.xaml 的交互逻辑
    /// </summary>
    public partial class WinInsertValue : Window
    {
        #region 私有变量
        /// <summary>
        /// Redis配置Id。
        /// </summary>
        private readonly string configId;
        /// <summary>
        /// 数据库索引。
        /// </summary>
        private readonly int dbIndex;
        /// <summary>
        /// 键。
        /// </summary>
        private readonly string key;
        /// <summary>
        /// 数据类型。
        /// </summary>
        private readonly RedisKeyType type;
        /// <summary>
        /// 值。
        /// </summary>
        private readonly string value;
        #endregion


        #region 事件委托
        /// <summary>
        /// 当插入值成功时发生。
        /// <para>string：Redis配置Id。int：数据库索引。string：键。RedisKeyType：数据类型。</para>
        /// </summary>
        public event Action<string, int, string, RedisKeyType> OnValueInserted;
        #endregion


        #region 构造方法
        /// <summary>
        /// 使用指定的参数创建 DeskRedis.WinInsertValue 的实例。
        /// </summary>
        /// <param name="configId">Redis配置Id。</param>
        /// <param name="dbIndex">数据库索引。</param>
        /// <param name="key">键。</param>
        /// <param name="type">数据类型。</param>
        public WinInsertValue(string configId, int dbIndex, string key, RedisKeyType type)
        {
            InitializeComponent();

            this.configId = configId;
            this.dbIndex = dbIndex;
            this.key = key;
            this.type = type;

            switch (type)
            {
                case RedisKeyType.None:
                case RedisKeyType.String:
                    break;
                case RedisKeyType.List:
                case RedisKeyType.Set:
                    this.stackpanelScore.Visibility = Visibility.Collapsed;
                    this.stackpanelKey.Visibility = Visibility.Collapsed;
                    break;
                case RedisKeyType.SortedSet:
                    this.stackpanelKey.Visibility = Visibility.Collapsed;
                    break;
                case RedisKeyType.Hash:
                    this.stackpanelScore.Visibility = Visibility.Collapsed;
                    break;
                default:
                    break;
            }
        }
        #endregion


        /// <summary>
        /// 当鼠标点击“添加”按钮时发生。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnInsert_Click(object sender, RoutedEventArgs e)
        {
            string value = this.tbValue.Text.Trim();
            if (string.IsNullOrEmpty(value))
            {
                MessageBox.Show("请输入值！");
                return;
            }

            try
            {
                switch (this.type)
                {
                    case RedisKeyType.List:
                        GlobalBusiness.RedisCaches[this.configId]
                                      .AddList(this.key, value, this.dbIndex);
                        break;
                    case RedisKeyType.Set:
                        GlobalBusiness.RedisCaches[this.configId]
                                      .AddSet(this.key, value, this.dbIndex);
                        break;
                    case RedisKeyType.SortedSet:
                        {
                            string strScore = this.tbScore.Text;
                            if (string.IsNullOrEmpty(strScore))
                            {
                                MessageBox.Show("请输入排序号！");
                                return;
                            }
                            if (!double.TryParse(strScore, out double score))
                            {
                                MessageBox.Show("非法的排序号，只能输入数字！");
                                return;
                            }
                            GlobalBusiness.RedisCaches[this.configId]
                                          .AddSortedSet(this.key, value, this.dbIndex);
                        }
                        break;
                    case RedisKeyType.Hash:
                        {
                            string hashKey = this.tbKey.Text.Trim();
                            if (string.IsNullOrEmpty(hashKey))
                            {
                                MessageBox.Show("请输入哈希键！");
                                return;
                            }
                            GlobalBusiness.RedisCaches[this.configId]
                                          .AddHash(this.key, hashKey, value, this.dbIndex);
                        }
                        break;
                    default:
                        throw new NotSupportedException("不支持的数据类型：" + this.type);
                }
                MessageBox.Show("添加成功！");
                this.OnValueInserted?.Invoke(this.configId, this.dbIndex, this.key, this.type);
                this.Close();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show($"添加失败！{ex.Message}");
            }
        }



        /// <summary>
        /// 当鼠标点击“关闭”按钮时发生。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnCancel_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}
